객체 타입
객체 타입
info
대부분의 타입스크립트는 객체 타입을 지정해줄 때 인터페이스를 사용하는 것을 선호한다.
type Poet = {
born: number;
name: string;
}
let poetLater: Poet {
born: 1935,
name: "Cho Byeong Min"
}
구조적 타이핑
- 타입스크립트의 타입 시스템은 구조적으로 타입화되어 있다.
- 즉, 타입을 충족하는 모든 값을 해당 타입의 값으로 사용할 수 있다.
type WithFirstName = {
firstName: string;
};
type WithLastName = {
lastName: string;
};
const hasBoth = {
firstName: 'Cho',
lastName: 'Byeong Min',
};
let withFirstName: WithFirstName = hasBoth;
let withLastName: WithLastName = hasBoth;
- hasBoth는 각각 string 타입의 firstName과 lastName을 포함한다.
사용 검사
- 할당하는 값에는 객체 타입의 필수 속성이 있어야 한다.
- 객체 타입에 필요한 모든 속성이 없다면 타입 오류를 발생시킨다.
type FirstAndLastName = {
first: string;
last: string;
};
const hasBoth: FirstAndLastName = {
first: 'Cho',
last: 'Byeong Min',
};
// 에러 발생
const hasOnlyOne: FirstAndLastName = {
first: 'Cho',
};
const hasFullInfo: FirstAndLastName = {
first: 'Cho',
last: 'Byeong Min',
age: 29,
};
- hasOnlyOne은 last 속성이 없어 타입 오류가 발생한다.
- hasFullInfo는 객체 타입에서 정의된 것 보다 많은 속성을 가지고 있어 타입 오류를 일으킨다.
선택적 속성
타입의 속성 앞에 ?를 추가해주면 타입 속성을 생략할 수 있다.
type Book = {
author?: string;
pages: number;
}
const ok: Book {
author: "Byeong Min",
pages: 80
}
const missingOk: Book = {
pages: 100
}
- missingOk에서 author를 생략하여도 타입 오류가 발생하지 않는다.
명시된 객체 타입 union
type PoemWithPages = {
name: string;
pages: number;
}
type PoemWithRhymes = {
name: string;
rhymes: boolean;
}
type Poem = PoemWithPages | PoemWithRhymes;
const poem = Poem {}
poem.name;
poem.pages; // 에러 발생
poem.rhymes; // 에러 발생
- name 속성은 항상 존재하기 때문에 접근이 가능하다.
- pages와 rhymes는 항상 존재한다는 보장이 없어 타입 오류를 일으킨다.
교차 타입
type Artwork = {
genre: string;
name: string;
};
type Writing = {
pages: number;
name: string;
};
type WrittenArt = Artwork & Writing;
// 다음과 같음
// {
// genre: string;
// name: string;
// pages: number;
// }
- 교차 타입은 다른 객체 타입이나 유니온 타입을 결합할 수 있다.